Skip to content
字数
502 字
阅读时间
3 分钟

刨析 JS 中的 forEach、for in、for of 三类循环原理和性能 - 掘金

神奇的 Symbol.iterator - 掘金

JS 中的可枚举属性与不可枚举属性的学习以及扩展 - 掘金

可枚举属性

属性的 enumerable 设置为 true

Object.keys() 只遍历当前对象的可枚举属性
for...in 遍历当前对象及其原型链上所有的可枚举属性

实现 iterator 规范的对象

JavaScript 的 Iterator 接口与循环 - 掘金

Array,Map,Set,String 等等类可以在被 for...of 中执行,因为它们都实现了 Symbol.iterator 接口

而 Number,Object 就没有实现 [Symbol.iterator]

  1. 首先会执行 Symbol.iterator 属性对应的函数且返回一个对象
  2. 对象内包含一个方法 next(), 循环一次(还有 return()throw() 方法),next 返回另一个对象
  3. 这个对象内包含 done(标记当前迭代是否完成)和 value(每个迭代器元素的值)属性,
  4. done 值为 false 或者 undefined 时,迭代可以继续;值为 true 迭代完成,不能再继续遍历

forEach 和 for of 跳出循环

forEach:return 无法终止循环。不过可以起到 continue 效果(本身是不支持的 continue 与 break 语句

for…of: 是 ES6 新增的方法,但是 for…of 不能去遍历普通的对象,for…of 的好处是可以使用 break 跳出循环(可以正确响应 break、continue 和 return 语句

for of 和 for in 区别

(1)for…in 用于可枚举数据,如对象、数组、字符串
(2)for…of 用于可迭代数据,如数组、字符串、Map、Set

for of 是根据迭代器 (Iterator) 实现的内容返回结果,所以就不会遍历不在范围的东西,而 for...in 会把所有的键遍历出来。

javascript
const arr = ["a", "b", "c"];
arr.testValue = 1;

for (const item of arr) {
    console.log(item);
    // a
    // b
    // c
}

for (const item in arr) {
    console.log(item);
    // 0
    // 1
    // 2
    // testValue
}

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写